home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / powervww / pvlist.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-05  |  4.3 KB  |  196 lines

  1. //  ____________________________________________________
  2. // |                                                    |
  3. // |  Project:     POWER VIEW INTERFACE                 |
  4. // |  File:        PVLIST.CPP                           |
  5. // |  Compiler:    WPP386 (10.6)                        |
  6. // |                                                    |
  7. // |  Subject:     Dynamic lists implementation         |
  8. // |                                                    |
  9. // |  Author:      Emil Dotchevski                      |
  10. // |____________________________________________________|
  11. //
  12. // E-mail: zajo@geocities.com
  13. // URL:    http://www.geocities.com/SiliconValley/Bay/3577
  14.  
  15. #define uses_basics
  16. #define uses_list
  17.  
  18. #define DECLARE_PVLIST
  19. #include "PVuses.h"
  20. #undef DECLARE_PVLIST
  21.  
  22. //LIST
  23.  
  24. Tlist::Tlist( void ):
  25.   vcount( _vcount ),
  26.   vcurrent( _vcurrent ),
  27.   vbeg_print( _vbeg_print ),
  28.   vmax_print( _vmax_print )
  29. {
  30.   vcount = 0;
  31.   vcurrent = 0;
  32.   vbeg_print = 0;
  33.   scroll_ahead = 2;
  34.   options = 0;
  35. }
  36.  
  37. Tlist::Tlist( Tlist *_list ):
  38.   vcount( _list->vcount ),
  39.   vcurrent( _vcurrent ),
  40.   vbeg_print( _vbeg_print ),
  41.   vmax_print( _vmax_print )
  42. {
  43.   scroll_ahead = _list->scroll_ahead;
  44.   options = loASSOCIATED;
  45. }
  46.  
  47. Tlist::Tlist( uint &v_count, uint &v_current, uint &v_beg_print, int &v_max_print ):
  48.   vcount( v_count ),
  49.   vcurrent( v_current ),
  50.   vbeg_print( v_beg_print ),
  51.   vmax_print( v_max_print )
  52. {
  53.   vcount = 0;
  54.   vcurrent = 0;
  55.   vbeg_print = 0;
  56.   scroll_ahead = 2;
  57.   options = 0;
  58. }
  59.  
  60. Tlist::~Tlist( void )
  61. {
  62.   if( !( options & loASSOCIATED ) ) clear();
  63. }
  64.  
  65. void Tlist::clear( void )
  66. {
  67.   vcount = 0;
  68.   vcurrent = 0;
  69.   vbeg_print = 0;
  70. }
  71.  
  72. void Tlist::up( void )
  73. {
  74.   cursor_up_left( vcurrent, vbeg_print, vmax_print, scroll_ahead );
  75. }
  76.  
  77. void Tlist::down( void )
  78. {
  79.   cursor_down_right( vcurrent, vbeg_print, vmax_print, vcount, scroll_ahead );
  80. }
  81.  
  82. void Tlist::pgup( void )
  83. {
  84.   for( uint i = 1; i < vmax_print; i++ ) up();
  85. }
  86.  
  87. void Tlist::pgdn( void )
  88. {
  89.   for( uint i = 1; i < vmax_print; i++ ) down();
  90. }
  91.  
  92. void Tlist::top( void )
  93. {
  94.   cursor_top_home( vcurrent, vbeg_print );
  95. }
  96.  
  97. void Tlist::bottom( void )
  98. {
  99.   cursor_bottom_end( vcurrent, vbeg_print, vmax_print, vcount );
  100. }
  101.  
  102. void Tlist::at( uint i )
  103. {
  104.   cursor_at( i, vcurrent, vbeg_print, vmax_print, vcount );
  105. }
  106.  
  107. uint Tlist::findf( Tlfilter p )
  108. {
  109.   cur_filter = p;
  110.   find_index = 0;
  111.   return findn();
  112. }
  113.  
  114. uint Tlist::findn( void )
  115. {
  116.   while( ( find_index < vcount ) && !cur_filter( this, find_index ) )
  117.     find_index++;
  118.   if( find_index >= vcount ) return (uint) -1;
  119.   return find_index;
  120. }
  121.  
  122. void Tlist::inc_count( void )
  123. {
  124.   vcount++;
  125. }
  126.  
  127. void Tlist::dec_count( void )
  128. {
  129.   vcount--;
  130. }
  131.  
  132.  
  133. void cursor_up_left( uint ¤t, uint &beg_print, uint max_print, uint scroll_ahead )
  134. {
  135.   if( current < beg_print ) beg_print = current;
  136.   if( current >= ( beg_print + max_print ) )
  137.     if( current > max_print )
  138.       beg_print = current - max_print;
  139.     else
  140.       beg_print = 0;
  141.   if( current )
  142.   {
  143.     current--;
  144.     if( ( ( beg_print + scroll_ahead ) > current ) && beg_print ) beg_print--;
  145.   }
  146. }
  147.  
  148. void cursor_down_right( uint ¤t, uint &beg_print, uint max_print, uint count, uint scroll_ahead )
  149. {
  150.   if( !count )
  151.   {
  152.     current = 0;
  153.     return;
  154.   }
  155.   if( current < beg_print ) beg_print = current;
  156.   if( current >= beg_print + max_print )
  157.     if( current > max_print )
  158.       beg_print = current - max_print;
  159.     else
  160.       beg_print = 0;
  161.   if( current < ( count - 1 ) )
  162.   {
  163.     current++;
  164.     if( ( ( ( current + scroll_ahead ) - beg_print ) >= max_print ) &&
  165.        ( ( beg_print + max_print ) < count ) ) beg_print++;
  166.   }
  167. }
  168.  
  169. void cursor_top_home( uint ¤t, uint &beg_print )
  170. {
  171.   beg_print = 0;
  172.   current = 0;
  173. }
  174.  
  175. void cursor_bottom_end( uint ¤t, uint &beg_print, uint max_print, uint count )
  176. {
  177.   if( !count )
  178.   {
  179.     current = 0;
  180.     beg_print = 0;
  181.     return;
  182.   }
  183.   current = count - 1;
  184.   if( current >= max_print )
  185.     beg_print = current - max_print + 1;
  186.   else
  187.     beg_print = 0;
  188. }
  189.  
  190. void cursor_at( uint i, uint ¤t, uint &beg_print, uint max_print, uint count )
  191. {
  192.   if( !count || ( i >= count ) ) return;
  193.   current = i;
  194.   beg_print = min( max( 0, count - max_print ), max( 0, current - ( max_print >> 1 ) ) );
  195. }
  196.